package com.example.fall_guard_band.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.Map;

public class JwtUtil {

    /**
     * 生成jwt
     * 使用Hs256算法, 私匙使用固定秘钥
     *
     * @param secretKeyBytes jwt秘钥字节数组形式
     * @param ttlMillis      jwt过期时间(毫秒)
     * @param claims         设置的信息
     * @return
     */
    public static String createJWT(byte[] secretKeyBytes, long ttlMillis, Map<String, Object> claims) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        SecretKey secretKey = Keys.hmacShaKeyFor(secretKeyBytes);

        // 生成JWT的时间
        long expMillis = System.currentTimeMillis() + ttlMillis;
        Date exp = new Date(expMillis);

        // 设置jwt的body
        return Jwts.builder()
                .setClaims(claims)
                .signWith(secretKey, signatureAlgorithm)
                .setExpiration(exp)
                .compact();
    }

    /**
     * Token解密
     *
     * @param secretKeyBytes jwt秘钥字节数组形式 此秘钥一定要保留好在服务端, 不能暴露出去, 否则sign就可以被伪造, 如果对接多个客户端建议改造成多个
     * @param token          加密后的token
     * @return
     */
    public static Claims parseJWT(byte[] secretKeyBytes, String token) {
        SecretKey secretKey = Keys.hmacShaKeyFor(secretKeyBytes);
        return Jwts.parserBuilder()
                .setSigningKey(secretKey)
                .build()
                .parseClaimsJws(token)
                .getBody();
    }
}
